{{>licenseInfo}}
{{#models}}{{#model}}defmodule {{moduleName}}.Model.{{classname}} do
  @moduledoc """
  {{&description}}
  """

  @derive JSON.Encoder
  defstruct [
    {{#vars}}{{#atom}}{{&baseName}}{{/atom}}{{^-last}},
    {{/-last}}{{/vars}}
  ]

  @type t :: %__MODULE__{
    {{#vars}}{{#atom}}{{&baseName}}{{/atom}} => {{{datatype}}}{{#isNullable}} | nil{{/isNullable}}{{^isNullable}}{{^required}} | nil{{/required}}{{/isNullable}}{{^-last}},
    {{/-last}}{{/vars}}
  }

{{#hasComplexVars}}
  alias {{&moduleName}}.Deserializer

  def decode(value) do
    value
    {{#vars}}
    {{^isPrimitiveType}}
    {{#baseType}} |> Deserializer.deserialize({{#atom}}{{&baseName}}{{/atom}}, {{#isArray}}:list, {{&moduleName}}.Model.{{{items.baseType}}}{{/isArray}}{{#isMap}}:map, {{&moduleName}}.Model.{{{items.baseType}}}{{/isMap}}{{#isDate}}:date, nil{{/isDate}}{{#isDateTime}}:datetime, nil{{/isDateTime}}{{^isDate}}{{^isDateTime}}{{^isMap}}{{^isArray}}:struct, {{moduleName}}.Model.{{baseType}}{{/isArray}}{{/isMap}}{{/isDateTime}}{{/isDate}})
    {{/baseType}}
    {{/isPrimitiveType}}
    {{/vars}}
{{/hasComplexVars}}
{{^hasComplexVars}}
  def decode(value) do
    value
{{/hasComplexVars}}
  end
end
{{/model}}{{/models}}
